package top.honlnk.common.utils;

import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import top.honlnk.common.constant.UserConstant;
import top.honlnk.common.exception.CustomException;


@Slf4j
public class BaiduOCRTableResultValidatorUtil {
    public JSONObject validator(@NotNull JSONObject imageOCRData) {
        // 创建一个用于记录第几个表格是我们想要的值班表的表格 int
        int targetTableIndex = -1;
        // 创建一个用于表示数据中是否拥有值班课的变量 boolean
        boolean hasTargetTable = false;

        try {
            // 判断返回结果中是否有错误码，并根据错误码进行相应的处理
            if (imageOCRData.has("error_code")) {
                if (imageOCRData.getInt("error_code") == 6 && imageOCRData.getString("error_msg").equals("No permission to access data")) {
                    log.error(UserConstant.INVALID_CLIENT_LOG, imageOCRData);
                    throw new CustomException(UserConstant.INVALID_CLIENT + imageOCRData.getString("error_msg"));
                }

                if (imageOCRData.getInt("error_code") == 216201 && imageOCRData.getString("error_msg").equals("image format error")) {
                    log.error(UserConstant.IMAGE_FORMAT_ERROR_LOG ,imageOCRData);
                    throw new CustomException(UserConstant.IMAGE_FORMAT_ERROR);
                }
            }
            // 判断返回结果中包含的表格数量，如果超过一个，后续无法处理，抛出异常提示用户重新裁剪图片
            if (imageOCRData.has("table_num")) {
                if (imageOCRData.getInt("table_num") < 1) {
                    throw new CustomException(UserConstant.NO_TABLE_IN_IMAGE);
                }
                // 获取imageOCRData中的tables_result数据，存储到一个列表中
                if (imageOCRData.has("tables_result")) {
                    JSONArray tablesResult = imageOCRData.getJSONArray("tables_result");
                    // 循环判断tablesResult中的数据
                    for (int i = 0; i < tablesResult.length(); i++) {
                        JSONObject tableResult = tablesResult.getJSONObject(i);
                        // 获取tableResult中的第n个对象中的body属性中的数据
                        if (tableResult.has("body")) {
                            JSONArray body = tableResult.getJSONArray("body");
                            // 循环判断body中的数据
                            for (int j = 0; j < body.length(); j++) {
                                JSONObject cell = body.getJSONObject(j);
                                // 判断body中的每个对象中的col_end属性和row_end，是否分别col_end>6 && col_end<8和row_end>6 && row_end<13，
                                // 如果满足条件，则认为该表格符合我们的标准，记录这个body所在的tablesResult的下标，并且记录此次数据有符合标准的课程表，退出循环。
                                if (cell.getInt("col_end") >= 6 && cell.getInt("col_end") <= 8 &&
                                        cell.getInt("row_end") >= 6 && cell.getInt("row_end") <= 13) {
                                    targetTableIndex = i;
                                    hasTargetTable = true;
                                    break;
                                }
                            }
                            if (hasTargetTable) {
                                break;
                            }
                        }
                    }

                    // 如果没有找到符合标准的课程表，则抛出异常提示用户重新裁剪图片，或更换图片
                    if (!hasTargetTable) {
                        throw new CustomException(UserConstant.NO_TARGET_TABLE_IN_IMAGE);
                    }
                    // 如果有找到符合标准的课程表，则返删除掉tablesResult中的其他子项，仅留下符合标准的课程表，因为后续处理他的数据的时候是直接获取tablesResult下标为0的哪个数据（也就是第一个数据）
                    JSONArray filteredTablesResult = new JSONArray();
                    filteredTablesResult.put(tablesResult.getJSONObject(targetTableIndex));
                    imageOCRData.put("tables_result", filteredTablesResult);
                    log.info("第{}个表是我们需要的课程表", targetTableIndex);
                    log.info("过滤后的数据为：{}", filteredTablesResult);
                    log.info("最终数据为：{}", imageOCRData);
                }
            } else {
                throw new CustomException(UserConstant.OCR_IMAGE_FAIL);
            }
        } catch (JSONException e) {
            log.error(UserConstant.JSON_PARSE_ERROR, e);
            throw new CustomException(e.getMessage());
        }

        return imageOCRData;
    }
}
